/**
*
*  Elaborado por: Roberto Loaeza Valerio.
*                 geoAPP.
*                 28-abr-2006.
*
**/
package main;

import ewe.fx.Image;
import ewe.ui.CellConstants;
import ewe.ui.Editor;
import ewe.ui.ImageControl;
import ewe.ui.InputStack;
import ewe.ui.mButton;
import ewe.ui.mInput;
/**
 * Radiacion Auxliliar
 * @author Roberto Loaeza Valerio
 *
 */
public class RadiacionAuxiliar extends Editor{

	private mInput anguloA =new mInput();
	private mInput anguloB =new mInput();
	private mInput anguloX =new mInput();
	private mInput distanciaA = new mInput();
	private mInput distanciaB = new mInput();
	private mInput distanciaX = new mInput();
	private mButton mcalcular;
	
	private double angA, angB, distA, distB;
	private double angX, distX;
	/**
	 * Regresa angulo calculado
	 * @return Angulo calculado (double)
	 */
	public double getAngulo() {
		return angX;
	}
	/**
	 * Regresa distancia calculada
	 * @return Distancia (double)
	 */
	public double getDistancia(){
		return distX;
	}

	private boolean valorValido(char val, String patron) {		
		for(int i=0; i<patron.length(); i++)
			if(val==patron.charAt(i))
				return true;
		return false;		
	}
	
	
	private double sexagecimal2decimal(String ang) {
		double new_ang=0;		
		boolean esDecimal = true;
		String buffer="";		
		for(int i=0; i<ang.length(); i++) {
			switch(ang.charAt(i)) {
			case 176:
			case 'º' :
				new_ang += Double.parseDouble(buffer);
				buffer="";
				esDecimal=false;
				break;				
			case '\'' :
				new_ang += Double.parseDouble(buffer)/60;
				buffer="";
				esDecimal=false;
				break;
			case '\"' :
				new_ang += Double.parseDouble(buffer)/60/60;
				buffer="";
				esDecimal=false;
				break;
			default:
				if(!valorValido(ang.charAt(i), "1234567890."))
					return 0;
				else
					buffer+=ang.charAt(i);
				break;
			}				
		}				
		return esDecimal?Double.valueOf(ang).doubleValue():new_ang;
	}

	private double validaValor(String valor, String patron) {
		for(int i=0; i<valor.length(); i++)
			if(!valorValido(valor.charAt(i), patron))
				return 0;
		return Double.valueOf(valor).doubleValue();
	}

	private void ValidarTodo() {
		this.angA = anguloA.getText().length()>0?sexagecimal2decimal(anguloA.getText()):0;
		this.angB = anguloB.getText().length()>0?sexagecimal2decimal(anguloB.getText()):0;
		this.distA = distanciaA.getText().length()>0?validaValor(distanciaA.getText(),"0123456789."):0;
		this.distB = distanciaB.getText().length()>0?validaValor(distanciaB.getText(),"0123456789."):0;
		
		
	}
	
	/**
	 * Radiacion auxiliar
	 * @param nombreCampos Campos a mostrar
	 */
	public RadiacionAuxiliar(String [] nombreCampos) {
		
		InputStack is = new InputStack();
		is.inputLength = 5;
		InputStack is2 = new InputStack();
		is2.inputLength = 5;				
		is.add(anguloA, nombreCampos[0]+":");
		is.add(anguloB, nombreCampos[1]+":");
		is.add(distanciaA, nombreCampos[2]+":");
		is.add(distanciaB, nombreCampos[3]+":");
		is.add(mcalcular=new mButton(nombreCampos[4]),"");
				
		is2.add(anguloX, nombreCampos[5]+":");
		is2.add(distanciaX, nombreCampos[6]+":");
		
		Image img ;											
		img = new Image(nombreCampos[7]);
		img.background =img.transparent;
		addNext(is,CellConstants.HSTRETCH,CellConstants.FILL).setCell(DONTSTRETCH).setControl(HFILL|VCENTER);
		addLast(new ImageControl(img)).setCell(DONTSTRETCH).setControl(HFILL|VCENTER);	
		addLast(is2,CellConstants.HSTRETCH,CellConstants.FILL);
		
	}
	
	/**
	 * 
	 * Calcular los nuevos valores
	 *
	 */
	public void calcularValores()
    {    	
		ValidarTodo();
		distX=(distA*distA)+(distB*distB);
		distX-=2*(distA*distB)*Math.cos(angA*Math.PI/180);
		distX=Math.sqrt(distX);							
		angX=(distB*distB);
		angX+= (distX*distX);
		angX-=(distA*distA);    			
		angX/=( 2*distB*distX);
		angX=Math.acos(angX)*180/Math.PI;
		angX+=angB;
    }
	public boolean handleAction(String action) {
		//Archivo->Salir		
		if(action.equals(mcalcular.getText().toString())) {			
			calcularValores();
			anguloX.setText(String.valueOf(angX).toString());
			distanciaX.setText(String.valueOf(distX).toString());
		}
		return super.handleAction(action);
	}
}
